package com.tang.java8.Stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author tlm
 * @version 1.0
 * @date 2020/3/16 13:23
 * Java8 新特性之Stream流
 * Java 8 API添加了一个新的抽象称为流Stream，可以让你以一种声明的方式处理数据。
 * Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
 * Stream API可以极大提高Java程序员的生产力，让程序员写出高效率、干净、简洁的代码。
 * 这种风格将要处理的元素集合看作一种流， 流在管道中传输， 并且可以在管道的节点上进行处理， 比如筛选， 排序，聚合等。
 * 元素流在管道中经过中间操作（intermediate operation）的处理，最后由最终操作(terminal operation)得到前面处理的结果。
 */
public class StreamTest1 {
    public static void main(String[] args) {
        /*
         * 在 Java 8 中, 集合接口有两个方法来生成流：
         * 1.stream() − 为集合创建串行流。
         * 2.parallelStream() − 为集合创建并行流。
         */


        /*
        例1 : filter()
        去除list中的空元素
         */
        List<String> strings = Arrays.asList("abc", "", "faker", "tx", "efg", "", "uzi");
        List<String> result = strings
                //转为串行流
                .stream()
                // filter:保留 boolean 为 true 的元素,底层用的是Predicate断定型接口
                .filter(string -> !string.isEmpty())
                //转为List
                .collect(Collectors.toList());
        //输出
        System.out.println("例1 result:" + result.toString());
        //输出结果为   例1 result:[abc, faker, tx, efg, uzi]


         /*
        例2 :  distinct()
        去除list中的重复元素
         */
        List<String> strings2 = Arrays.asList("abc", "abc", "faker", "faker", "efg", "efg", "uzi");
        List<String> result2 = strings2
                .stream()
                //去重
                .distinct()
                .collect(Collectors.toList());
        //输出
        System.out.println("例2 result:" + result2.toString());
        //输出结果为   例2 result:[abc, faker, efg, uzi]


        /*
        例3 :   sorted()  limit(long n)
        对List 排序并返回前5个元素
         */
        List<Integer> integerList = Arrays.asList(155, 169, 75, 33, 234, 566, 1024, 999);
        List<Integer> result3 = integerList
                .stream()
                //排序
                .sorted()
                //返回前5个元素
                .limit(5)
                .collect(Collectors.toList());
        //输出
        System.out.println("例3 result:" + result3.toString());
        //输出结果为   例3 result:[33, 75, 155, 169, 234]


        /*
        例4 :    skip(long n)
           去除前 n 个元素
         */
        List<Integer> result4 = integerList
                .stream()
                //去除前5个元素
                .skip(5)
                .collect(Collectors.toList());
        //输出
        System.out.println("例4 result:" + result4.toString());
        //输出结果为   例4 result:[566, 1024, 999]

        //tips:
        //
        //用在 limit(n) 前面时，先去除前 m 个元素再返回剩余元素的前 n 个元素
        //limit(n) 用在 skip(m) 前面时，先返回前 n 个元素再在剩余的 n 个元素中去除 m 个元素

        result4 = integerList
                .stream()
                //返回前6个元素
                .limit(6)
                //去除前5个元素
                .skip(5)
                .collect(Collectors.toList());
        //输出
        System.out.println("例4 result:" + result4.toString());
        //输出结果为   例4 result:[566]





    }
}
